home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mgr / src / pixel.c < prev    next >
C/C++ Source or Header  |  1990-09-16  |  3KB  |  120 lines

  1. /*                        Copyright (c) 1989 Bellcore
  2.  *                            All Rights Reserved
  3.  *       Permission is granted to copy or use this program, EXCEPT that it
  4.  *       may not be sold for profit, the copyright notice must be reproduced
  5.  *       on copies, and credit should be given to Bellcore where it is due.
  6.  *       BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
  7.  */
  8. /*    $Header: pixel.c,v 1.1 89/05/10 18:21:32 sau Locked $
  9.     $Source: /usr/u/sau/mgr/src/dec/RCS/pixel.c,v $
  10. */
  11. static char    RCSid_[] = "$Source: /usr/u/sau/mgr/src/dec/RCS/pixel.c,v $$Revision: 1.1 $";
  12.  
  13. /*
  14.  * set/clear/ or invert a pixel (Portable version) (SAU) 
  15.  * return current bit setting (i.e. may be used to replace bit_on)
  16.  */
  17.  
  18. #include "bitmap.h"
  19. #ifdef atarist
  20. #include <linea.h>
  21. #endif
  22.  
  23. bit_point(map,x,y,op)
  24. register BITMAP *map;
  25. register int x,y;
  26. int op;
  27.    {
  28.    register int bit;                            /* dst bit */
  29.     register DATA *base;                            /* dst word */
  30.  
  31.    /* clipping */
  32.  
  33. #ifndef NOCLIP
  34.    if (x<0 || x>BIT_WIDE(map) || y<0 || y>BIT_HIGH(map))
  35.       return(-1);
  36. #endif
  37.  
  38. #ifdef INVERT
  39.     /* invert all raster ops */
  40.  
  41.     op = op_invert[15&op];
  42. #endif
  43.  
  44.     x += map->x0;
  45.     y += map->y0;
  46. #ifdef atarist
  47.     if (IS_SCREEN(map)) {
  48.         return scrpoint(map, x, y, op);
  49.     }
  50. #endif
  51.    base = y * BIT_LINE(map) + (x>>LOGBITS) + (map->data);
  52.    bit = GETLSB(MSB,(x & BITS));
  53.   
  54.    switch(OPCODE(op)) {
  55.         case OPCODE(SRC):
  56.         case OPCODE(SRC | DST):
  57.         case OPCODE(SRC | ~DST):
  58.         case OPCODE(~0):
  59.             *base |= bit;
  60.          break;
  61.         case OPCODE(~SRC):
  62.         case OPCODE(~(SRC|DST)):
  63.         case OPCODE(DST & ~SRC):
  64.         case OPCODE(0):
  65.             *base &= ~bit;
  66.          break;
  67.         case OPCODE(SRC ^ DST):
  68.         case OPCODE(~DST):
  69.         case OPCODE(SRC & ~DST):
  70.         case OPCODE(~(SRC&DST)):
  71.             *base ^= bit;
  72.          break;
  73.       }
  74.    return(*base&bit);
  75.    }
  76.  
  77. #ifdef atarist
  78. scrpoint(map,x,y,op)
  79. register BITMAP *map;
  80. register int x,y;
  81. int op;
  82.    {
  83.    register int bit;                    /* dst bit */
  84.    extern short *Intin, *Ptsin;
  85.  
  86.    /* clipping */
  87.  
  88.    Ptsin[0] = x;
  89.    Ptsin[1] = y;
  90.    bit = linea2();
  91.  
  92.    switch(OPCODE(op)) {
  93.         case OPCODE(SRC):
  94.         case OPCODE(SRC | DST):
  95.         case OPCODE(SRC | ~DST):
  96.         case OPCODE(~0):
  97.             Intin[0] = bit = 0xf;    /* set */
  98.                  break;
  99.         case OPCODE(~SRC):
  100.         case OPCODE(~(SRC|DST)):
  101.         case OPCODE(DST & ~SRC):
  102.         case OPCODE(0):
  103.              Intin[0] = bit = 0;    /* clear */
  104.                  break;
  105.         case OPCODE(SRC ^ DST):
  106.         case OPCODE(~DST):
  107.         case OPCODE(SRC & ~DST):
  108.         case OPCODE(~(SRC&DST)):
  109.             bit = linea2();        /* get old bit */
  110.             Intin[0] = bit = bit ^ 0xf;    /* invert */
  111.                  break;
  112.         default:
  113.             bit = linea2();
  114.             return bit;
  115.       }
  116.       linea1();            /* set bit */
  117.       return bit;
  118.    }
  119. #endif
  120.